package cn.drenal.capcap.service.impl;

import cn.drenal.capcap.entity.Category;
import cn.drenal.capcap.exception.BizException;
import cn.drenal.capcap.mapper.CategoryMapper;
import cn.drenal.capcap.service.CategoryService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 分类服务实现类
 */
@Service
@RequiredArgsConstructor
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {

    @Override
    public Category createCategory(Category category) {
        // 检查分类名称是否已存在
        if (lambdaQuery().eq(Category::getName, category.getName()).exists()) {
            throw new BizException("分类名称已存在");
        }
        
        // 设置默认值
        if (category.getSort() == null) {
            category.setSort(0);
        }
        if (category.getStatus() == null) {
            category.setStatus(1); // 默认启用
        }
        
        // 保存分类
        save(category);
        return category;
    }

    @Override
    public Category updateCategory(Long id, Category category) {
        // 检查分类是否存在
        Category existingCategory = getById(id);
        if (existingCategory == null) {
            throw new BizException("分类不存在");
        }
        
        // 检查分类名称是否已存在（排除自身）
        if (StringUtils.hasText(category.getName()) && 
                !category.getName().equals(existingCategory.getName()) && 
                lambdaQuery().eq(Category::getName, category.getName()).exists()) {
            throw new BizException("分类名称已存在");
        }
        
        // 更新分类信息
        category.setId(id);
        updateById(category);
        
        return getById(id);
    }

    @Override
    public void deleteCategory(Long id) {
        // 检查分类是否存在
        if (!lambdaQuery().eq(Category::getId, id).exists()) {
            throw new BizException("分类不存在");
        }
        
        // TODO: 检查是否有作品使用该分类，如果有则不允许删除
        
        // 逻辑删除分类
        removeById(id);
    }

    @Override
    public Category getCategoryById(Long id) {
        Category category = getById(id);
        if (category == null) {
            throw new BizException("分类不存在");
        }
        return category;
    }

    @Override
    public Page<Category> getCategoryPage(Page<Category> page, String name, Integer status) {
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
        
        // 添加查询条件
        if (StringUtils.hasText(name)) {
            queryWrapper.like(Category::getName, name);
        }
        
        if (status != null) {
            queryWrapper.eq(Category::getStatus, status);
        }
        
        // 按排序字段升序排序
        queryWrapper.orderByAsc(Category::getSort);
        
        return page(page, queryWrapper);
    }

    @Override
    public List<Category> getAllEnabledCategories() {
        return lambdaQuery()
                .eq(Category::getStatus, 1) // 1-启用
                .orderByAsc(Category::getSort)
                .list();
    }

    @Override
    public Category updateCategoryStatus(Long id, Integer status) {
        // 检查分类是否存在
        Category category = getById(id);
        if (category == null) {
            throw new BizException("分类不存在");
        }
        
        // 检查状态是否有效
        if (status != 0 && status != 1) { // 0-禁用，1-启用
            throw new BizException("无效的状态值");
        }
        
        // 更新状态
        category.setStatus(status);
        updateById(category);
        
        return category;
    }
}